
/**
 * 函数初始化，输出初始化信息。
 */
function init() {
  log("f程序初始化");
}

/**
 * 发送POST请求。
 * @param {string} url - 请求的URL。
 * @param {object} data - 请求的数据。
 * @returns {string} - 返回的数据。
 */
function post(url, data){
  var res = http.post(url, data);
  var data = res.body.string();
  if (data) {
    return data;
  }
}

/**
 * 发送GET请求。
 * @param {string} url - 请求的URL。
 * @returns {string} - 返回的数据。
 */
function get(url) {
  var res = http.get(url);
  var data = res.body.string();
  if (data) {
    return data;
  }
}

/**
 * 读取本地数据。
 * @param {string} name - 存储对象的名称。
 * @param {string} key - 存储对象的键。
 * @returns {*} - 返回存储的数据，如果不存在则返回undefined。
 */
function getLocal(key) {
  const storage = storages.create('ABC');
  if (storage.contains(key)) {
    return storage.get(key);
  }
}

/**
 * 读取本地数据。
 * @param {string} name - 存储对象的名称。
 * @param {string} key - 存储对象的键。
 * @returns {*} - 返回存储的数据，如果不存在则返回undefined。
 */
function setLocal(key, value) {
  const storage = storages.create('ABC');
  return storage.put(key, value);
}

/**
 * 判断应用是否在前台，如果不是则启动应用。
 * @param {string} pkg - 应用的包名。
 * @param {number} n - 延迟的秒数，默认为5。
 * @returns {boolean} - 返回是否在前台运行。
 */
function active(pkg, n) {
  n = n ? n : 5;
  if (currentPackage() === pkg) {
    log("应用在前台");
    return true;
  } else {
    log("启动应用");
    app.launch(pkg);
    sleep(1000)
    ms({ "textMatches": "允许|始终允许" }, true)
    sleep(n * 1000)
  }
}

/**
 * 准备点击。
 * @param {number} x - 点击的x坐标。
 * @param {number} y - 点击的y坐标。
 * @param {number} sleeptime - 点击后的延迟时间，默认为1秒。
 * @param {string} name - 对点击的对象进行描述。
 * @returns {boolean} - 返回是否执行了点击操作。
 */
function click_(x, y, sleeptime, name) {
  sleeptime = sleeptime ? sleeptime : 1;
  if (name) {
    log(`准备点击->${name}->(x:${x}, y:${y})`);
  } else {
    log(`准备点击坐标->(x:${x}, y:${y})`);
  }
  if (x > 0 && y > 0) {
    click(x, y);
    sleep(sleeptime * 1000);
    return true;
  } else {
    log('坐标错误');
  }
}

/**
 * 点击对象。
 * @param {object} obj - 要点击的对象。
 * @param {number} sleeptime - 点击后的延迟时间，默认为1秒。
 * @param {string} name - 对点击的对象进行描述。
 * @returns {boolean} - 返回是否执行了点击操作。
 */
function clickObj(obj, sleeptime, name) {
  sleeptime = sleeptime ? sleeptime : 1;
  log(name ? ("准备点击对象->" + name) : "点击未命名对象");
  var x = obj.bounds().centerX();
  var y = obj.bounds().centerY();
  return click_(x, y, sleeptime, name);
}

/**
 * 穿透点击。
 * @param {object} obj - 要进行穿透点击的对象。
 * @param {number} sleeptime - 点击后的延迟时间，默认为1秒。
 * @param {string} name - 对穿透点击的对象进行描述。
 * @param {number} lun - 穿透点击的轮次，默认为3次。
 * @returns {boolean} - 返回是否执行了穿透点击操作。
 */
function clickTrue(obj, sleeptime, name, lun) {
  sleeptime = sleeptime ? sleeptime : 1;
  var result = false;
  lun = lun ? lun : 3;
  for (let i = 0; i < lun; i++) {
    if (obj && obj.clickable()) {
      obj.click();
      log(name ? (`准备穿透点击对象->${name}`) : "准备穿透点击未命名对象");
      result = true;
      break;
    }
    obj = obj.parent();
  }
  if (result) {
    sleep(sleeptime * 1000);
  }
  return result;
}

/**
 * 正则点击。
 * @param {object} obj - 查询条件对象。
 * @param {boolean} clicks - 是否进行点击操作。
 * @param {number} sleeptimes - 点击后的延迟时间，默认为1秒。
 * @param {string} name - 对点击的对象进行描述。
 * @param {number} findtime - 查找对象的最长时间，默认为200。
 * @param {number} lun - 穿透点击的轮次，默认为3。
 * @returns {boolean} - 返回是否执行了点击操作。
 */
function ms(obj, clicks, sleeptimes, name, findtime, lun) {
  sleeptimes = sleeptimes ? sleeptimes : 1;
  findtime = findtime ? findtime : 200;
  lun = lun ? lun : 3;

  var txt = '';
  for (let key in obj) {
    if (key.search("Matches") > 0) {
      eval("var matches = /" + obj[key] + "/")
      txt = txt + key + '(' + matches + ').'
    } else if (key == 'boundsInside') {
      txt = txt + key + '(' + obj[key] + ').'
    } else {
      txt = txt + key + '("' + obj[key] + '").'
    }
  }
  var txt = `let objs = ${txt}findOne(${findtime});`
  log(txt)
  eval(txt)
  if (objs) {
    log('找到==>' + (objs.text() || objs.desc() || objs.id() || objs.className()));
    if (clicks) {
      name = obj['textMatches'] || obj['descMatches'] || obj['idMatches'] || obj['text'] || obj['desc'] || obj['id'];
      if (lun < 1 || !clickTrue(objs, sleeptimes, name, lun)) {
        log('准备坐标点击');
        return clickObj(objs, sleeptimes, name);
      }
    }
    return true;
  }
}

/**
 * 生成指定范围内的随机数。
 * @param {number} min - 随机数的下限。
 * @param {number} max - 随机数的上限。
 * @returns {number} - 返回生成的随机数。
 */
function rd(min, max) {
  if (min <= max) {
    return random(min, max);
  } else {
    return random(max, min);
  }
}

/**
 * 模拟滑动操作。
 * @param {number} x - 起始点的x坐标。
 * @param {number} y - 起始点的y坐标。
 * @param {number} x1 - 终点的x坐标。
 * @param {number} y1 - 终点的y坐标。
 * @param {number} times - 滑动的时间，默认为500毫秒。
 */
function moveTo(x, y, x1, y1, times) {
  swipe(x, y, x1, y1, times);
  sleep(1000);
}

/**
 * 通过id获取文本内容。
 * @param {string} idstr - 控件的id。
 * @returns {string} - 返回获取到的文本内容。
 */
function getTextById(idstr) {
  try {
    return id(idstr).findOne(200).text();
  } catch (e) {
    log(e);
  }
}

function getCurrentDate() {
  var today = new Date();
  var year = today.getFullYear();
  var month = today.getMonth() + 1; // 月份是从 0 开始的，所以要加 1
  var day = today.getDate();
  // 格式化月份和日期，保证它们始终是两位数
  month = (month < 10) ? '0' + month : month;
  day = (day < 10) ? '0' + day : day;
  var currentDate = year + '-' + month + '-' + day;
  return currentDate;
}

function notice(txt){
  var url = 'https://oapi.dingtalk.com/robot/send?access_token=c230bf201cf694db851c14413af45f3c216754466886f7f46647eb3678d809a4'
  var postData = {"msgtype": "text","text": {"content":`通知，${txt}`}}
  http.postJson(url, postData)
}

// init()
module.exports = {
  init,
  post,
  get,
  setLocal,
  getLocal,
  active,
  click_,
  clickObj,
  clickTrue,
  ms,
  rd,
  moveTo,
  getTextById,
  getCurrentDate,
  notice
};